package com.osgix.htmlEngine;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Date;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletContext;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class SinpleEngine {
	/**
	 * 使用freemarker生成静态页面
	 * 
	 * @param data
	 *            数据集
	 * @param templatePath
	 *            模板文件路径, 这是一个绝对对路径
	 * @param targetHtmlPath
	 *            生成静态页面的路径，这是一个绝对路径
	 * @throws Exception
	 */
	public void crateHTML(Map data, String templatePath, String outputFilePath) throws Exception {
		Writer out = null;
		try {
			data.put("name", "soluo");
			data.put("now", new Date());
			Configuration freemarkerCfg = new Configuration();
			// 加载模版
			// 指定模板文件所在的文件夹
			freemarkerCfg.setDirectoryForTemplateLoading(new File("/"));
			freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
			// 指定模版名称，获取模板
			Template template = freemarkerCfg.getTemplate(templatePath, "UTF-8");
			template.setEncoding("UTF-8");

			// 生成文件的输入路径
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFilePath), "UTF-8"));
			// 从模版中生成文件
			template.process(data, out);
			out.flush();
			out.close();

		} catch (Exception e) {
			e.printStackTrace();
			if (out != null) {
				try {
					out.flush();
					out.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			throw e;
		}
	}

	/**
	 * 使用freemarker生成静态页面
	 * 
	 * @param context
	 *            ServletContext上下文
	 * @param data
	 *            数据集
	 * @param templatePath
	 *            模板文件路径, 这是一个相对于web上下文的路径
	 * @param targetHtmlPath
	 *            生成静态页面的路径，这是一个相对于web上下文的路径
	 */
	public static void crateHTML(ServletContext context, Map data, String templatePath, String outputFile)
			throws Exception {
		Writer out = null;
		try {
			Configuration freemarkerCfg = new Configuration();
			// 加载模版
			freemarkerCfg.setServletContextForTemplateLoading(context, "/");
			freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
			// 指定模版路径
			Template template = freemarkerCfg.getTemplate(templatePath, "UTF-8");
			template.setEncoding("UTF-8");
			// 静态页面路径
			String htmlPath = context.getRealPath(File.separator) + File.separator + outputFile;
			File htmlFile = new File(htmlPath);
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
			// 处理模版
			template.process(data, out);
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
			if (out != null) {
				try {
					out.flush();
					out.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			throw e;
		}
	}

	/**
	 * 使用freemarker生成字符串
	 * 
	 * @param data
	 * @param templatePath
	 *            模板文件路径, 这是一个绝对对路径
	 * @return string
	 * @throws Exception
	 */
	public String crateHTML(Map data, String templatePath) throws Exception {
		StringWriter writer = null;
		try {
			data.put("name", "soluo");
			data.put("now", new Date());
			Configuration freemarkerCfg = new Configuration();
			// 加载模版
			// 指定模板文件所在的文件夹
			freemarkerCfg.setDirectoryForTemplateLoading(new File(File.separator));
			freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
			// 指定模版名称，获取模板
			Template template = freemarkerCfg.getTemplate(templatePath, "UTF-8");
			template.setEncoding("UTF-8");

			writer = new StringWriter();
			template.process(data, writer);
			String text = writer.toString();
			writer.close();

			return text;
		} catch (Exception e) {
			e.printStackTrace();
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			throw e;
		}
	}
}